package com.ang.mqtt.config;

import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory;
import org.springframework.integration.mqtt.core.MqttPahoClientFactory;

import javax.annotation.Resource;

/**
 * 配置类
 */
@Configuration
public class MqttConfig {

    @Resource
    private MqttProperties mqttProperties;


    /**
     * 自定义option
     * @return
     */
    @Bean("mqttOptions")
    public MqttConnectOptions getMqttConnectOptions() {
        MqttConnectOptions options = new MqttConnectOptions();
        // 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录，
        // 这里设置为true表示每次连接到服务器都以新的身份连接
        options.setCleanSession(true);
        // 设置连接的用户名
        options.setUserName(mqttProperties.getUsername());
        // 设置连接的密码
        options.setPassword(mqttProperties.getPassword().toCharArray());
        options.setServerURIs(mqttProperties.getHostUrl());
        // 设置超时时间 单位为秒
        options.setConnectionTimeout(10);
        // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送心跳判断客户端是否在线，但这个方法并没有重连的机制
        options.setKeepAliveInterval(20);
        // 设置“遗嘱”消息的话题，若客户端与服务器之间的连接意外中断，服务器将发布客户端的“遗嘱”消息。
//        options.setWill("willTopic", WILL_DATA, 2, false);

        return options;
    }

    /**
     * 创建工厂
     * @param mqttOptions
     * @return
     */
    @Bean("mqttFactory")
    public MqttPahoClientFactory mqttClientFactory(MqttConnectOptions mqttOptions) {
        DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
        factory.setConnectionOptions(mqttOptions);
        return factory;
    }
}

